From: Boris Ostrovsky Date: Thu, 11 Aug 2016 11:18:24 +0000 (+0200) Subject: x86/HVM: add more checks verifying that PIT/PIC/IOAPIC are emulated X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~574 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=5fe65b5eafc8897549f23ca83a3105f63a79867b;p=xen.git x86/HVM: add more checks verifying that PIT/PIC/IOAPIC are emulated Signed-off-by: Boris Ostrovsky Reviewed-by: Jan Beulich --- diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c index ba9b293376..1d5d287950 100644 --- a/xen/arch/x86/hvm/vlapic.c +++ b/xen/arch/x86/hvm/vlapic.c @@ -1114,7 +1114,14 @@ static int __vlapic_accept_pic_intr(struct vcpu *v) struct domain *d = v->domain; struct vlapic *vlapic = vcpu_vlapic(v); uint32_t lvt0 = vlapic_get_reg(vlapic, APIC_LVT0); - union vioapic_redir_entry redir0 = domain_vioapic(d)->redirtbl[0]; + union vioapic_redir_entry redir0; + + ASSERT(has_vpic(d)); + + if ( !has_vioapic(d) ) + return 0; + + redir0 = domain_vioapic(d)->redirtbl[0]; /* We deliver 8259 interrupts to the appropriate CPU as follows. */ return ((/* IOAPIC pin0 is unmasked and routing to this LAPIC? */ @@ -1130,7 +1137,7 @@ static int __vlapic_accept_pic_intr(struct vcpu *v) int vlapic_accept_pic_intr(struct vcpu *v) { - if ( vlapic_hw_disabled(vcpu_vlapic(v)) ) + if ( vlapic_hw_disabled(vcpu_vlapic(v)) || !has_vpic(v->domain) ) return 0; TRACE_2D(TRC_HVM_EMUL_LAPIC_PIC_INTR, @@ -1145,6 +1152,9 @@ void vlapic_adjust_i8259_target(struct domain *d) { struct vcpu *v; + if ( !has_vpic(d) ) + return; + for_each_vcpu ( d, v ) if ( __vlapic_accept_pic_intr(v) ) goto found; diff --git a/xen/arch/x86/hvm/vpt.c b/xen/arch/x86/hvm/vpt.c index 358ec576fe..5c48fdb4b5 100644 --- a/xen/arch/x86/hvm/vpt.c +++ b/xen/arch/x86/hvm/vpt.c @@ -496,7 +496,7 @@ void pt_adjust_global_vcpu_target(struct vcpu *v) struct pl_time *pl_time; int i; - if ( v == NULL ) + if ( !v || !has_vpit(v->domain) ) return; vpit = &v->domain->arch.vpit;